///////////////////////////////////////////////////////////
//  OQLMediaCondition.cpp
//  Implementation of the Class OQLMediaCondition
//  Created on:      23-sep-2007 21:26:41
///////////////////////////////////////////////////////////

#include "OQLMediaCondition.h"


OQLMediaCondition::OQLMediaCondition(){

}



OQLMediaCondition::~OQLMediaCondition(){

}


ListPersistent OQLMediaCondition::resolve(OQLCondition* cond){
	
	ListPersistent list, retorno;
	ResolveDBRequest res;
	std::string valor("");
	std::string atributo("");
	//double result = 0;
	
	atributo += this->attribute[0].nombre;
	
	retorno.setAtributte(atributo);
	list.setAtributte(atributo);
	
	if(cond == NULL)
	{
		ResultMedia * media = new ResultMedia();
		double result = res.resolveMedia((*this));
		media->setResult(result);
		list.insertSort(media);
		return list;
	}
	else
	{
		ListPersistent lsAux = cond->resolve(this->getTable());
		double valAux = 0,cant=0;
		bool isValid = false;
		for (int i = 0; i < lsAux.getSize(); i++){
			Persistent * current = lsAux.getPersistent(i);
			std::string val = current->getValor(this->getAttribute()[0].nombre);
			if ( NumberUtil::isNumber(val) == 1){
				valAux += atof(val.c_str());
				++cant;
				isValid = true;
			}
		}
		if (isValid){
			ResultMedia * media = new ResultMedia();
//	    	double result =  valAux / lsAux.getSize(); no todos los elementos de la lista son validos
			double result =  valAux / cant;
	    	media->setResult(result);
	    	list.insertSort(media);
		}
		lsAux.clear();
    	return list;
//		Persistent* objectMax = NULL;
//		Persistent* objectMin = NULL;
//		
//		OQLMaxCondition opMax;
//		opMax.setAttribute(this->getAttribute());
//		opMax.setTable(this->getTable());
//		
//		ListPersistent lsMax = opMax.resolve(cond);
//		
//		if (lsMax.getSize()==0){
//			return retorno;
//		}
//		
//		OQLMinCondition opMin;
//		opMin.setAttribute(this->getAttribute());
//		opMin.setTable(this->getTable());
//		
//		ListPersistent lsMin = opMin.resolve(cond);
//		
//		if (lsMin.getSize()==0){
//			if (lsMax.getSize()>0)
//				lsMax.clear();
//			return retorno;
//		}
//		
//		objectMax = lsMax.getFirst();
//		objectMin = lsMin.getFirst();
//		
//		std::string value1 = objectMax->getValor(this->getAttribute()[0].nombre);
//		std::string value2 = objectMin->getValor(this->getAttribute()[0].nombre);
//		
//		lsMax.clear();
//		lsMin.clear();
//		
//		if (NumberUtil::isNumber(value1) && NumberUtil::isNumber(value2)){
//			ResultMedia * media = new ResultMedia();
//	    	double doubleOne = atof(value1.c_str());
//	    	double doubleTwo = atof(value2.c_str());
//	    	double result =  ((doubleOne + doubleTwo) / 2);
//	    	media->setResult(result);
//	    	list.insertSort(media);
//	    	return list;
//		}else{
//			// TODO lanzar excepcion
//		}
//		
//		return list;
	}
	
}


